#include "Thread.hpp"
#include <vector>
#include <cstdio>
#include "LockGuard.hpp"
using namespace ThreadMoudle;

int tickes = 1e4; // 共享资源，造成了数据不一致的问题

// 解决方法，加互斥锁

// 定义一把锁
// pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;

void route(ThreadDate *td)
{
    while (true)
    {
        LockGuard lockguard(td->_lock); // RAII风格的锁
        if (tickes > 0)
        {
            // 抢票过程
            usleep(1000); // 1ms ---抢票花费时间
            printf("who: %s, get a tickes: %d\n", td->_name.c_str(), tickes);
            tickes--;
        }
        else
        {
            break;
        }
    }
}

// void route(ThreadDate *td)
// {
//     // cout << td->_name << ": " << "mutex address: " << td->_lock << endl;
//     // sleep(1);

//     while (true)
//     {
//         pthread_mutex_lock(td->_lock); // 加锁
//         if (tickes > 0)
//         {
//             // 抢票过程
//             usleep(1000); // 1ms ---抢票花费时间
//             printf("who: %s, get a tickes: %d\n", td->_name.c_str(), tickes);
//             tickes--;
//             pthread_mutex_unlock(td->_lock); // 解锁
//         }
//         else
//         {
//             pthread_mutex_unlock(td->_lock); // 解锁
//             break;
//         }
//     }
// }

static int threadnum = 4;
int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);
    vector<Thread> threads;
    for (int i = 0; i < threadnum; i++)
    {
        string name = "thread - " + to_string(i + 1) + " ";
        ThreadDate *td = new ThreadDate(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for (auto &thrs : threads)
    {
        thrs.Start();
    }

    for (auto &thrs : threads)
    {
        thrs.Join();
    }

    pthread_mutex_destroy(&mutex);

    // Thread t1("thread-1 ", route);
    // Thread t2("thread-2 ", route);
    // Thread t3("thread-3 ", route);
    // Thread t4("thread-4 ", route);

    // t1.Start();
    // t2.Start();
    // t3.Start();
    // t4.Start();

    // t1.Join();
    // t2.Join();
    // t3.Join();
    // t4.Join();
}

// const int gum = 10;
// void Print(const string &name)
// {
//     int cnt = 1;
//     while (true)
//     {
//         cout << name << "is running , cnt: " << cnt++ << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     //我在管理原生线程！！
//     // 构建线程对象
//     vector<Thread> threads;
//     for (int i = 0; i < gum; i++)
//     {
//         string name = "thread-" + to_string(i + 1) + " ";
//         threads.emplace_back(name, Print);
//     }

//     // 统一启动
//     for (auto &thr : threads)
//     {
//         thr.Start();
//     }

//     sleep(5);

//     // 统一结束
//     for (auto &thr : threads)
//     {
//         thr.Stop();
//     }

//     // 等待线程等待
//     for (auto &thr : threads)
//     {
//         thr.Join();
//     }
//     // Thread t("thread-1 ", Print);
//     //  t.Start();
//     //  cout << t.Name() << "Status: " << t.Status() << endl;
//     //  sleep(5);
//     //  cout << t.Name() << "Status: " << t.Status() << endl;
//     //  t.Stop();
//     //  sleep(2);
//     //  cout << t.Name() << "Status: " << t.Status() << endl;
//     //  t.Join();
//     //  cout << "join done ..." << endl;
//     return 0;
// }